#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
const int N=1005;
const int INF=0x3f3f3f3f;
int g[N][N];
int n,ml,md;
int dis[N];
int vis[N];
int u,v,w;
int inque[N];
bool flag;
int spfa(int s){
    for(int i=1;i<=n;i++){
        dis[i]=INF;
    }
    vis[s]=true;
    dis[s]=0;
    queue<int> q;
    q.push(s);
    inque[s]=1;
    while(!q.empty()){
        int cur=q.front();
        q.pop();
        vis[cur]=false;
        for(int i=1;i<=n;i++){
            if(g[cur][i]==INF){
                continue;
            }
            if(dis[cur]+g[cur][i]<dis[i]){
                dis[i]=dis[cur]+g[cur][i];
                if(!vis[i]){
                    q.push(i);
                    vis[i]=true;
                    inque[i]++;
                    if(inque[i]>n){
                        flag=true;
                        break;
                    }
                }
            }
        }
        if(flag){
            break;
        }
    }

    //负环 无解
    if(flag){
        return -1;
    }
    //最短路为INF 任意摆放位置
    else if(dis[n]==INF){
        return -2;
    }
    else{
        return dis[n];
    }
}
int main(void){
    //freopen("data.txt","r",stdin);
    scanf("%d%d%d",&n,&ml,&md);
    memset(g,INF,sizeof(g));
    //差分约束 求最大可能距离 转换为<=的不等式组
    //同理 若求最小可能距离 >=求最长路
    //按顺序摆放
    //S[i]-S[i-1]>=0 S[i-1]-S[i]<=0
    for(int i=1;i<=n;i++){
        g[i][i-1]=0;
    }
    //B-A<=X
    while(ml--){
        scanf("%d%d%d",&u,&v,&w);
        g[u][v]=w;
    }
    //D-C>=Y 即C-D<=-Y
    while(md--){
        scanf("%d%d%d",&u,&v,&w);
        g[v][u]=-w;
    }
    printf("%d\n",spfa(1));
    return 0;
}
